#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

//void swap1(int a, int b)
//{
//	int temp = a;
//	a = b;
//	b = temp;
//	cout << "sawp1a=" << a << "  " << "swap1b=" << b << endl;
//}

//void swap2(int* p1, int* p2)
//{
//	int temp = *p1;
//	*p1 = *p2;
//	*p2 = temp;
//}
//

void bubblesort(int* arr, int len)
{
	for (int i = 0; i < len-1; i++)
	{
		for (int j = 0; j < len-1; j++)
		{
			int temp = arr[j];
			arr[j] > arr[j + 1] ? arr[j] = arr[j + 1], arr[j + 1] = temp : true;
		}
		len--;
	}
}

void printfarrary(int* arr, int len)
{
	cout << "排序后: ";
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

int main()
{
	//指针:
	//一:基本概念:
	//作用:可以通过指针间接访问内存
	//内存编号是从0开始记录的，一般用十六进制数字表示
	//可以利用指针变量保存地址



	//二、指针的定义和使用:
	//1.定义指针:
	//语法:数据类型 * 指针变量
	//int a = 10;
	//int* p;
	//让指针记录变量a的地址
	//p = &a;
	//cout << "a的地址为：" << &a << endl;
	//cout << "指针p为：" << p << endl;

	//2.使用指针
	//可以通过解引用的方式来找到指针指向的内存:
	//*p = 1000;
	//cout << "a=" << a << endl;
	//cout << "*p=" << *p << endl;



	//三、指针所占的内存空间:
	//int a = 10;
	//int* p = &a;
	//在32位操作系统中指针占4个字节,64位操作系统占8个字节.(不管是什么数据类型)
	//cout << "sizeof int* = " << sizeof(int*) << endl;
	//cout << "sizeof p = " << sizeof(p) << endl;



	//四、空指针和野指针
	//1.空指针：指针变量指向内存中编号为0的空间
	//用途：初始化指针变量
	//注意：空指针指向的内存是不可以访问的(0~255之间的内存编号是系统占用的，不可访问)
	//int* p = NULL;
	//*p = 100;

	//2.野指针:指针变量指向非法的内存空间
	//int* p = (int*)0x0001;
	//cout << *p << endl;
	//空指针和野指针都不是我们申请的空间，因此补药访问

	

	//五、const修饰指针:
	//1.const修饰指针---常量指针(指针的指向可以修改，但是指针指向的值不可修改)
	//int a = 10;
	//int b = 20;
	//const int* p = &a;
	//*p = 15;//错误，指针指向的值不可以修改
	//p = &b;//正确，指针的指向可以修改

	//2.const修饰常量---指针常量(指针的指向不可以改，指针的值可以修改)
	//int a = 10;
	//int b = 20;
	//int* const p = &a;
	//*p = 15;//正确，指向的值可以修改
	//p = &b;//错误，指向不可以修改

	//3.const既修饰指针，又修饰常量(指针的指向和指向的值都不可以修改)
	//int a = 10;
	//int b = 20;
	//const int* const p = &a;



	//六、指针和数组:
	//作用:利用指针访问数组中的元素
	//int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//int* p = arr;//arr就是数组的首地址
	//cout << "利用指针访问第一个元素为:"<< *p <<endl;
	//p++;//让指针向后移四个字节
	//cout << "利用指针访问第二个元素为:" << *p << endl;
	////利用指针访问数组中的所有元素:
	//int* p1 = arr;
	//cout << "数组中的所有元素为:";
	//for (int i = 0; i < 10; i++,p1++)
	//{
	//	cout << *p1 << "  ";
	//}cout << endl;



	//七、指针和函数:
	//作用:利用指针作函数参数，可以修改实参的值
	//1.值传递:
	//int a = 10;
	//int b = 20;
	//swap1(a, b);
	//cout << "a=" << a <<"  " << "b=" << b << endl;

	//2.地址传递:(可以修改实参)
	//swap2(&a, &b);
	//cout << "a = " << a << endl;
	//cout << "b = " << b << endl;
	//不想修改实参用值传递，想修改实参用地址传递



	//指针、数组、函数:
	//案例：封装一个函数，利用冒泡排序，实现对整型数组的升序排列
	int arr[10] = { 3,2,5,6,1,7,9,8,4,10 };
	cout << "排序前:";
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << " ";
	}cout << endl;

	int len = sizeof(arr) / sizeof(arr[0]);
	bubblesort(arr, len);
	printfarrary(arr, len);
	
	system("pause");
	return 0;
}